跳到主要内容

Linux 下的三种防火墙(IPtables、Firewall、UFW)

学而不思则罔,思而不学则殆。


导航


IPtables 部分

1、IPtables 四表五链。

  • 四表:raw(决定数据包是否被状态跟踪机制处理)、mangle(修改数据包的服务类型、TTL、并且可以配置路由实现 QOS)、nat(用于网络地址转换 IP 或端口)、filter(过滤数据包)。【通常我们只需要关注 filter、nat 表对应的链即可】
  • 五链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
  • 表可以理解为修改 TCP/IP 包头的不同位置、链可以理解为包被路由转换的不同阶段。 iptables 命令配置参数中遵循 “表--> 链--> 规则”,但以 “链--> 表--> 规则” 的方式更便于理解。【链相当于流量包要走的道路,而表相当于道路上的一些关卡,不同的表对应不同的关卡要负责检查各自的事情(有管放行、有管导航)】

2、规则中处理动作:ACCEPT(接受)、REJECT(拒绝但会回复被拒原因)、DROP(直接丢弃无响应)、REDIRECT(端口重定向)、MASQUERADE(源地址动态伪装)、LOG(记录日志而后继续向下匹配规则)、DNAT(目的 IP 转换)、SNAT(源 IP 转换)、MIRROR、QUEUE、RETURN、MARK。【详细介绍,某些动作还对应的独属于自己的参数选项,例如可通过 iptables -j DNAT -h 查看。】 这些动作也并非可以应用于所有表中的所有链,它们也有各自的适用范围。例,REDIRECT 动作只能作用于 nat 表的 PREROUTING 链、OUTPUT 链。 3、常用模块。

  • 模块使用技巧:(1)iptables -m mod -h 可在帮助末尾查询对应模块支持的参数帮助。(2)man iptables-extensions 可查看多种 iptables 模块的功能介绍及参数说明。(3)linux 命令行中通过 tab 加载不出来的模块并不代表该模块就无法使用,可能是 tab 补全功能并不完善。(4)模块存放路径在 ls /lib/modules/$(uname -r)/kernel/net/netfilter/目录下,可通过 lsmode | grep tcpudp 查找对应模块完整名称,再通过 modeinfo xt_tcpudp 查看模块详细情况。(5)模块通常都是在使用 iptables -m mod 时自动被系统 insmod 安装,若某些系统不支持自动安装时需通过手工的方式进行安装。
  • 模块介绍:【参考自博客 朱双印个人日志
  • tcp/udp:默认的链规则匹配条件只支持 -sd(源/目的 IP)、-p(协议)、-lo(网卡输入/输出接口),加载该模块后便可以支持 --dport、--sport 匹配条件。使用模块对应的功能时通常需要携带 -m mod 参数,但该模块的使用可以不携带 -m 参数,iptables 默认会根据 -p 指定的 tcp/udp 来隐式加载对应的模块。例,iptables -t filter -I INPUT ! -s 192.168.1.0/24 -p tcp -m tcp --dport 22:25 -j REJECT【匹配所有非 源地址为 192.168.1.0 网段且目的端口为 22-25 的包】;
  • multiport:该模块支持 --sports、--dports 匹配条件,允许指定多个不连续的端口号,增强了 --sport/--dport 匹配条件只能指定单个端口或连续端口的缺陷。 例,iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
  • iprange:该模块支持 --src-range、--dst-range 匹配条件,允许指定一段连续的 IP 地址范围。例,iptables -t filter -A INPUT -m iprange --src-range 192.168.1.1-192.168.1.10 -j DROP
  • string:该模块支持 --string、--hex-string 匹配条件,允许指定字符串来匹配包含对应字符串的数据包。例,iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT【在 tcp 报文中搜索 OOXX 的字符串,通常用于搜索 http 包中包含的数据】;
  • time: 该模块支持 --timestart、--timestop 匹配条件,允许根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。例,iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT【限制在早 9 晚 7 的时间段内不允许访问 80 网站】;
  • connlimit:该模块支持 --connlimit-above、--connlimit-mask 条件,可以限制每个 IP 地址同时链接到 server 端的链接数量,注意:我们不用指定 IP,其默认就是针对“每个客户端 IP”,即对单 IP 的并发连接数限制。例,iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT【限制在一个 C 类网段中 254 个 ip 总共只允许 20 个 ssh 连接】;
  • limit:该模块支持 --limit、--limit-burst 条件,可以限制单位时间内流入的包的数量【注:connlimit 模块是对连接数量进行限制的,limit 模块是对”报文到达速率”进行限制的。】例,iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT【令牌桶容量为 3,限制每分钟只允许放行 10 个 icmp 包】;
  • state:该模块支持 --state 状态 参数,实现了“连接追踪”机制,可以判断接收到的这些报文是为了回应我们之前发出的报文,还是主动向我们发送的报文。【注:(1)state 中的“连接”与 tcp 中的“连接”不能混为一谈,该连接可以面向 tcp、udp、icmp 等,属于一种状态连接。(2)state 有 5 种连接状态,分别是 NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED。】例,iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT【放行所有有连接状态的报文】;

4、规则配置技巧。

  1. 黑白名单机制。【该机制非传统意义上的黑白名单,它只是通过规则和默认策略之间动作的严格配合来达到传统黑白名单的效果,若配合不严格则黑白名单只是名存实亡。】(1)当链的默认策略为 ACCEPT 时,链中的规则对应的动作应该为 DROP 或者 REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是“黑名单”机制。(2) 当链的默认策略为 DROP 时,链中的规则对应的动作应该为 ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是“白名单”机制。(3)若默认策略已经为 ACCEPT,而我们在设置规则时,对应动作仍然为 ACCEPT,那么所有报文就都会被放行。因为不管报文是否被规则匹配到都会被 ACCEPT,所以该配置方法也就失去了访问控制的意义。
  2. 自定义链,即规则组。当针对各种服务(HTTP、SSH、FTP)的访问规则全部都写在一个链中时,规则的维护将变得异常复杂,此时最好的办法就是对规则进行分门别类,自定义链的出现很好的解决了此问题。(1)创建自定义链。iptables -t filter -N IN_WEB(2)在新链中添加规则。iptables -A IN_WEB -p tcp --dport 90 -j DROP(3)使用自定义链。iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB(4)删除自定义链。iptables -X WEB【注:(1)只有自定义链不被引用且内部规则被清空之后,自定义链才能被删除。(2)自定义的链需要和一个表进行绑定,相当于是这个表中的一个文件夹。(3)不能为自定义链配置默认策略,只有内置的链才可以。如,iptables -P FORWARD DROP。】
  3. 同类型服务,访问最苛刻的规则放在较宽松规则之前,否则报文都会通过宽松的规则直接处理而不会再匹配后面苛刻的规则,这样就会导致苛刻的规则相当于没配。如,规则 1:iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT 规则 2:iptables -t filter -A INPUT -p tcp --dport 80 -s 192.168.1.11 -j DROP,想达到除了 192.168.1.11 以外的其它人都可以访问 web 服务的效果,结果 192.168.1.11 还是可以访问 web 服务。
  4. 将命中频率更高的规则放在前面,这样可以提升防火墙处理包的效率。如,一天内访问 web 的次数是 1000 次,而 ftp 的次数是 100 次。若 web 规则序号是 1,ftp 序号是 2,则完成这 1100 次过滤,防火墙需要匹配 1000*1 + 100*2 = 1200 次;若 ftp 规则序号是 1,web 序号是 2,则完成这 1100 次过滤,防火墙需要匹配 100*1 + 1000*2 = 2100 次;
  5. 在配置 IPTABLES 白名单时,往往会将链的默认策略设置为 ACCEPT,通过在链的最后设置 REJECT 规则实现白名单机制。而不是将链的默认策略设置为 DROP,如果将链的默认策略设置为 DROP,当链中的规则一不小心被清空时(清空前规则中肯定是已经配置了远程连接放行的规则),管理员的连接请求也将会被 DROP 掉。

5、辅助命令。

  • iptables-save/iptables-restore:支持将配置的 iptables 规则导出及导入。【注:因 iptables 中配置的规则在主机重启之后就会丢失,因此规则的导入导出很重要。似乎大多数 iptables 版本都不支持将规则保存在默认位置或默认在末位置进行加载。另外,需关注目录 /etc/sysconfig/iptables 是否存在。】
  • iptables-persistent解决主机重启 iptables 规则失效的问题。【添加新的规则之后,执行 netfilter-persistent save 或修改 /etc/iptables/rules.v4 以达到永久保存规则的效果。】
  • iptables-apply:类似于 mysql 事务一样,支持回滚、提交。【注:当通过 ssh 远程修改 iptables 时,错误的配置可能会导致远程连接被拒绝,此时在一定时间内因无动作或未提交,iptables 规则将会回滚至某个正常的点。】例如,iptables-apply -t 20 tmp/iptables-save.txt,应用规则之后,如果与服务器断开了连接,那么 20 秒之后规则配置将恢复配置前的状态。
  • iptables-xml:支持将导出的 iptables 规则文件转换为 xml 格式。

6、杂项。

  1. 处理动作 REDIRECT 似乎不止针对本机的端口重定向,在开启 ip 包转发之后,接收到的那些目的地址非本机 ip 的包,如果条件满足重定向规则,那么系统似乎直接就将该包递送到了本机的重定向端口处,而不去理会包的目的 ip 是否是本机。【根据对 https 劫持工具 sslstrip 使用过程分析得出此结论】
  2. 默认重定向都是本地端口重定向,即不管收到的包的目的地址是否是本机 ip,动作 REDIRECT 都会直接将目的 ip/port 改为 127.0.0.1/redictport。【REDIRECT 动作作用于 PREROUTING 链、OUTPUT 链,均是本地 localhost 的端口重定向。】
  3. 出站的数据包方向已定,能更改的表已不能再决定其走向(故一般只更改源 IP 地址);进站的数据包方向待定,可以通过更改而决定是入站还是转发(可更改目的IP决定下一步的走向);转发的数据包同出站类似,方向已定。

*、规则配置示例。

  1. NAT 源地址转换:iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 192.168.1.1【仅该命令即可实现 NAT 上网,将拥有 2 块网卡且开启 ip 路由转发的 linux 主机变成一个路由器来使用。不必考虑返程数据包是否需要再进行 DNAT 的转换,iptable 似乎已智能跟踪生成返程数据包的 DNAT 转换规则。】
  2. NAT 目的地址转换:iptables -t nat -A PREROUTING -d 192.168.100.1 -p tcp --dport 1234 -j DNAT --to-destination 192.168.1.1:3389【同上述一样,一条命令可实现将内网主机暴露在公网并提供内网服务。】
  3. MASQUERADE 动态源地址转换:iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE【该规则适用于可上网网卡的 ip 地址不固定的 NAT 上网场景。】
  4. REDIRECT 端口重定向:iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-ports 22【服务端并未有监听 2222 的端口,但是客户端却可以通过 ssh -p 2222 root@192.168.250.150 来连接服务端的 ssh 服务】【wireshark 在本机捕获到的是访问 2222 端口的报文,而非是重定向后 22 的端口,由此可得:网卡捕获的进出数据包的位置是在 prerouting 链之前和 postrouting 链之后这两个位置。】
  5. 流量包过滤:iptables -A INPUT -p all -s 1.1.1.1 -j DROP 【丢弃 1.1.1.1 主机到访的所有协议的流量】
  6. 规则查看:iptables -L INPUT -t filter --line-numbers -n【查看 INPUT 链 filter 表的所有规则】

Firewall 部分

1、Firewall 防火墙属于智能化的 iptables 规则管理服务,它的底层功能实现依旧还是 iptables。它引进了 zone 的概念(相当于单张网卡的多个配置文件),并支持以网卡为单位进行 zone 规则的应用(使得不同信任级别的网卡可以分别对应不同级别的 zone 规则,而在 iptables 管理中,网卡之间的规则通常都是混为一谈的)。2、firewall 中的 zone 相当于策略集,不同类型的 zone 分别对应不同的策略。如,internal 和 block 区域中默认的 target 动作、预设的服务均不同。

  • 丢弃区域(Drop Zone,信任级别 1):丢弃所有无连接状态并主动连入的报文,有连接状态的包可进入,向外连接的包可放行。target 为 REJECT,无服务选中则允许连接特性,即选不选无效果。
  • 阻塞区域(Block Zone,信任级别 2):拒绝所有无连接状态并主动连入的报文,并返回 icmp-host-prohibited,有连接状态的包可进入,向外连接的包可放行。target 为 DROP,无服务选中则允许连接特性,即选不选无效果。
  • 信任区域(Trusted Zone,信任级别 9):允许所有网络连接通过。target 为 ACCEPT,无服务选中则允许连接特性,即选不选无效果。
  • 隔离区域(DMZ Zone,信任级别 5):如果想要只允许给部分服务能被外部访问,可以在 DMZ 区域中定义。target 为 default,支持只允许选中连接特性,即 ssh。
  • 外部区域(External Zone,信任级别 4):该区域与公共区域几乎无区别,仅是启用了伪装(masquerading)选项。target 为 default,支持只允许选中连接特性,默认只允许连接 ssh 服务。
  • 公共区域(Public Zone,信任级别 3)/工作区域(Work Zone,信任级别 6)/家庭区域(Home Zone,信任级别 7)/内部区域(Internal Zone,信任级别 8):这四个区域几乎无区别,target 均为 default,均支持只允许被选中的连接,默认只允许连接 ssh、dhcpv6-client、mdsn、samba-client 服务。
  • 注意:以上各区域之间的特性在 firewall-conf 图形化界面来看似乎无多大差别,具体细节可以通过 iptables -Lnv 来详细对比区别。

3、firewall 两种配置类型。

  1. Runtime:临时存在,立即生效。在 Runtime 模式下进行的修改,当执行重载(firewall-cmd --reload)或主机重启之后,修改将全部丢失,再次同 Permanent 配置保持一致。
  2. Permanent:长久存在,手动触发生效(重载/重启)。在 Permanen 模式下进行的修改,只有执行重载或重启之后,修改项才会在本机生效。

4、zone 面向绑定的 3 种类型。

  1. Connections:根据网卡绑定 zone。当前正处在连接状态的有线网络、无线网络,即桌面状态栏处可以看的见的连接网卡。
  2. Interfaces:根据虚拟网卡绑定 zone。一些虚拟的网络适配器,如本地回环 lo、docker 桥等。若指定的是一个未在线的有线网络,那么当连接在线时此处的配置自动消失,有线网络绑定的 zone 依旧以 Connections 处的 zone 为主。
  3. Sources:根据收到的包的源地址进行 zone 的匹配。一些 ip/mask 格式的网段。Source 与 Connections/Interfaces 难免会存在交集的地方,于是 Source 的优先级会高于另外 2 中类型。依据这一特性,可以实现黑白名单的效果(通常 rich rule 看起来更灵活一些)。例,活动的 Connection 绑定到 DROP 区域,将 Source 条目绑定到 TRUST 区域。

5、全局基础组件介绍。

  1. Services:服务管理。支持自定义一些常见服务或第三方的服务,可根据服务的特性进行 Port(监听端口/目的端口)、Source Port(限定连接主机的源端口不可太随意)、Protocols(未知)、Modules(根据 Helpers 中定义的项进行下拉选择,通常都是类似于 ftp 这样的多通道服务才会用到)、Destination(限定服务绑定的 IP 范围/目的 ip)的自定义,通常只需设置 Port 即可。
  2. IPSets:IP 集合。实现一条规则处理多个 ip,可重复使用而且便于管理。通常供 Rich Rule 所调用。
  3. ICMP Type:ICMP 类型管理。通常来说预定义的 icmp 类型都已包含,不需要再进行添加删除更改。
  4. Helpers:连接追踪助手。针对多连接通道服务,通过对应的追踪模块进行连接追踪。如,通过监听 ftp 21 端口的第一通道可以得知第二通道的连接端口号。

6、附带功能。

  1. Direct Configuration:相当于 iptables 的 GUI 操作界面,可直接以 iptables“表-链-规则”的方式配置防火墙。
  2. Lockdown whitelist:表示进行 SELinux 规则的配置,防止其它应用或用户对防火墙规则进行更改。

7、Zone 中的 过滤类型

  1. Services、Ports、Protocols、Source Ports、ICMP Filter,这 5 种过滤类型互相之间是“或”关系,且面向所有来源 ip 和目的 ip。优先级相等。
  2. Rich Rules,该过滤类型较灵活,可以为不同的规则分别配置不同的 target 动作,支持 IPSet、Log、Audit 功能,面向个例。优先级高于前 5 种过滤类型。

8、Zone 中的 功能类型

  1. Masquerading:源 ip 伪装。
  2. Port Forwarding:端口转发,支持本地端口转发和远程端口转发。

9、辅助命令。(1)firewall-cmd 命令行的防火墙管理器。(2)firewall-config 图形界面的防火墙规则管理器。10、杂项。

  1. panic 模式开启之后,所有进来出去的包都会被丢弃,此时不在以所在 zone 的策略规则进行限制。

*、规则配置示例。

  1. 列出当前区域的配置信息。firewall-cmd --list-all
  2. 检查指定区域指定服务是否被标记。firewall-cmd --zone = public --query-service = ssh
  3. 重载 Permanent 配置到 Runtime 。firewall-cmd --reload
  4. 放行指定端口。firewall-cmd --add-port = 80/tcp [--permanent]

UFW 部分

1、UFW 是为轻量化配置 iptables 而开发的一款工具,它的底层功能依旧还是 iptables 实现,最大的亮点就是简单,仅支持报文过滤、日志记录、转发。

2、命令介绍。

  1. ufw enable/disable 防火墙启用/禁用,同时也代表开机自启启用或禁用。
  2. ufw default allow/deny/reject [incoming/outgoing/routed] 三条通道的默认策略。
  3. ufw allow/deny/reject/limit/route/ rule 新增规则并设定动作,limit 限制访问速率、route 针对性路由转发。
  4. ufw delete/insert rule 规则管理。
  5. ufw reload/reset/status 规则重载/重置/查看。
  6. ufw app list/info ser-name 包含相关端口信息的服务应用列表。相当于 firewall 中的 services 管理部分。

3、辅助命令。(1)ufw 命令行防火墙管理器。(2)gufw 图形界面防火墙管理器,通常只有 ufw 命令行会被安装。4、杂项。

  1. 规则中使用的 service 名称,ufw 是根据 /etc/services 得来的对应服务的端口信息。
  2. 增删改防火墙规则之后,通常是不会立即生效的,需要重载或重启 ufw 来生效。默认策略的更改却会立即生效。
  3. 进站(incoming)的默认策略设置为 deny 之后,却依然无法阻挡 icmp 的请求。需在 ufw 配置文件 /etc/ufw/before.rules 添加 -A ufw-before-input -p icmp --icmp-type echo-request -j DROP 才能达到禁 ping 的效果。

*、规则配置示例。

  1. 基本格式:ufw [ --dry-run ] [ rule ] [ delete ] [ insert NUM ] [ preend ] allow | deny | reject | limit [ in | out [ on INTERFACE ]] [ log | log-all ] [ proto PROTOCOL ] [ from ADDRESS [ port PORT | app APPNAME ]] [ to ADDRESS [ port PORT | app APPNAME ]] [ comment COMMENT ]
  2. 允许一个 tcp25 的端口进入。ufw allow 25/tcp comment 'test';允许连接 ssh 服务。ufw allow ssh;允许连接 apache 服务。ufw allow Apache(app-name)
  3. 允许一个从 eth0 网卡进入到 eth1 网卡出去,且来源地址在 192.168.0.0/16 目的地址在 10.0.0.0/8 的包通过。如下图第三行。


对比总结

1、netfilter、iptables、firewall、ufw 之间的关系:netfilter--> iptables--> [ firewall | ufw ]。netfilter 处在最底层(内核),负责根据 上层下达的规则 对报文进行处理【实际干活的】;iptables 属于一个应用层临时命令工具,负责 制定一系列的规则 然后提交给 netfilter【部门领导】;firewall 和 ufw 属于一个应用层常驻服务工具,负责 用人性化的语言制定最齐全的规则 并将其转换为 iptables 理解的规则,然后让 iptables 再提交给 netfilter 进行处理【公司领导】。

  • iptables 属于一个应用层临时命令工具:规则制定之后 iptables 便不再参与什么活动,等系统重启之后之前配置的规则全部都丢失,只能再次通过 iptables-restore 来 手动 恢复之前通过 iptables-save 保存的规则。(有些 linux 发行版中,iptables 也属于一种常驻服务,可以通过服务管理工具统一对其进行管理。但是似乎不支持规则动态加载。)
  • firewall 和 ufw 属于一个应用层常驻服务工具:服务在启用之后便将自身此前存储的规则 自动 通过 iptables 进行加载,而后如果有新的规则变动,它们都可以支持规则的动态加载让其立即生效(ufw 存疑)。

2、应用平台。iptables 是红帽系列 6 及以下的默认防火墙(如 CentOS6.x),firewall 是红帽系列 7 及以上的默认防火墙(如 CentOS7.x),UFW 是 Debian 系列的默认防火墙。虽然都是在不同平台下的默认防火墙,但并非 ufw 就不能再红帽系列使用。3、兼容性。iptables 是 linux 防火墙的基石,所以存在 firewall、ufw 的地方就一定会看到 iptables。而在不启用 firewall、ufw 服务的情况下,也依旧可以通过 iptables 来使用防火墙。不过 firewall 和 ufw 同时存在并启的情况下,规则会很混乱。4、Firewall 防火墙与华为下一代 USG 防火墙 区域对比。USG 也使用了区域的概念,不过在使用上与 firewall 有很大的区别。

  • Firewall 区域:多规则的集合,将区域与流量通道(网络接口)进行绑定,达到对过往流量的控制。【面向单主机】 例,当一个报文从网卡进入时,系统便根据网卡绑定的区域进行对应区域规则的逐条匹配。
  • USG 区域:多接口的集合,将区域当做规则五元组(源/目的区域、源/目的 ip-port、动作)的一部分。整体使用上就是:接口划区--> 进入策略--> 创建规则。【面向多网络】 例,当一个报文从网卡进入时,系统根据网卡的来源得知其来源区域,又根据目的 ip 路由得出其去往网卡的目的区域,然后根据得到的信息(源/目的区域、源/目的 ip-port)开始逐条匹配策略中的规则。